home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1999 March / EnigmA AMIGA RUN 35 (1999)(G.R. Edizioni)(IT)[!][issue 1999-03].iso / earcd / -archivi / -recent1 / nsm_expand.lha / expand / expand.c < prev    next >
C/C++ Source or Header  |  1999-02-21  |  6KB  |  229 lines

  1. /*
  2.     Expand or Shrink the lines in the range or the current
  3.     block by a faktor/divisor.
  4.     Does allso update highlightened lines to new positions,
  5.     which the built in functions "RN_EXPANDBLOCK" and
  6.     "RN_SHRINKBLOCK" don't do. The source is programmed
  7.     to be fast, not easy to read.
  8.  
  9.     Recommended shortcut: Alt-Shift-Return.
  10.  
  11.     Made by Kjetil S. Matheussen.
  12.  
  13.     First version: 21.2.99.
  14.  
  15.     Link with /readstr.o and /octacontrol.o. Needs
  16.     at least NSM V074 to compile.
  17.  
  18.     e-mail: kjetilma@ifi.uio.no
  19.  
  20.     Address:
  21.     Kjetil S. Matheussen
  22.     5423 Sogn Studentby
  23.     0858 Oslo
  24.     Norway
  25. */
  26.  
  27. #include <string.h>
  28. #include "/nsm.h"
  29. #include "/readstr.h"
  30.  
  31. void main(){
  32.     OCTABASE ob;
  33.     BLOCKBASE bb;
  34.  
  35.     UWORD numlines,numtracks,track,page,numpages,highline;
  36.     UWORD    startline,endline,fromline;
  37.     int faktor,insertlines,line;
  38.  
  39.     char *dosbase,*filehandle;
  40.     char string[80];
  41.  
  42.     if((ob=getoctabase())==0) goto exit;            /* Allways include this line first in
  43.                                                                     your plug-ins. */
  44.  
  45.     dosbase=opendoslibrary();
  46.     filehandle=openoctacon(dosbase,400,60);
  47.  
  48.     bb=getcurrblockbase(ob);
  49.  
  50.     writestring(dosbase,filehandle,"(To shrink, use a \"/\" before faktor)\n\n",38);
  51.     writestring(dosbase,filehandle,"Expand faktor: ",16);
  52.     readstring(dosbase,filehandle,string,70);
  53.     if(string[0]!='/'){
  54.         sscanf(string,"%d",&faktor);
  55.     }else{
  56.         sscanf(string,"/%d",&faktor);
  57.     }
  58.     if(faktor<=1 || faktor>3200) goto close;
  59.  
  60.     numtracks=getnumtracks(bb);
  61.     numpages=getnumpages(bb)+1;
  62.     numlines=getnumlines(bb);
  63.  
  64.     if(string[0]!='/'){
  65.         if(isranged(ob)){
  66.             startline=getrangestartline(ob);
  67.             endline=getrangeendline(ob);
  68.  
  69.             insertlines=(endline-startline+1)*(faktor-1);
  70.  
  71.             numlines=numlines+insertlines;
  72.  
  73.             if(numlines>3200) goto close;
  74.  
  75.             sendrexxword("ED_SETBLOCKLINES LINES ",numlines,"");
  76.  
  77.             bb=getcurrblockbase(ob);        /* Have to update the bb-pointer, because we have
  78.                                                     changed the length of the block, and it has got a new base. */
  79.  
  80.  
  81.     /***************** move lines *************/
  82.  
  83.             for(line=numlines;line>endline+insertlines;line--){
  84.                 for(track=0;track<numtracks;track++){
  85.                     setnote(bb,track,line,getnote(bb,track,line-insertlines));
  86.                     setinum(bb,track,line,getinum(bb,track,line-insertlines));
  87.                     for(page=1;page<=numpages;page++){
  88.                         setcmdnum(bb,track,line,page,getcmdnum(bb,track,line-insertlines,page));
  89.                         setcmdlvl(bb,track,line,page,getcmdlvl(bb,track,line-insertlines,page));
  90.                     }
  91.                 }
  92.                 highline=getlinehighlight(bb,line-insertlines);
  93.                 if (highline!=getlinehighlight(bb,line))
  94.                     if (highline==1){
  95.                         setlinehighlight(bb,line);
  96.                     }else{
  97.                         unsetlinehighlight(bb,line);
  98.                     }
  99.             }
  100.  
  101.     /*************** expand range *************/
  102.  
  103.             fromline=endline;
  104.             for(line=endline+insertlines;line>startline;line--){
  105.                 if((line-startline)%faktor==0){
  106.                     for(track=0;track<numtracks;track++){
  107.                         setnote(bb,track,line,getnote(bb,track,fromline));
  108.                         setinum(bb,track,line,getinum(bb,track,fromline));
  109.                         for(page=1;page<=numpages;page++){
  110.                             setcmdnum(bb,track,line,page,getcmdnum(bb,track,fromline,page));
  111.                             setcmdlvl(bb,track,line,page,getcmdlvl(bb,track,fromline,page));
  112.                         }
  113.                     }
  114.                     highline=getlinehighlight(bb,fromline);
  115.                     if (highline!=getlinehighlight(bb,line))
  116.                         if (highline==1){
  117.                             setlinehighlight(bb,line);
  118.                         }else{
  119.                             unsetlinehighlight(bb,line);
  120.                         }
  121.                     fromline--;
  122.                 }else{
  123.                     for(track=0;track<numtracks;track++){
  124.                         setnote(bb,track,line,0);
  125.                         setinum(bb,track,line,0);
  126.                         for(page=1;page<=numpages;page++){
  127.                             setcmdnum(bb,track,line,page,0);
  128.                             setcmdlvl(bb,track,line,page,0);
  129.                         }
  130.                     }
  131.                     if (getlinehighlight(bb,line)==1) unsetlinehighlight(bb,line);
  132.                 }
  133.             }
  134.  
  135.         }else{
  136.             /********** Expand Block. ************/
  137.             sendrexxword("RN_EXPANDBLOCK ",faktor,"");
  138.             bb=getcurrblockbase(ob);
  139.             for(line=numlines;line>0;line--)
  140.                 if(getlinehighlight(bb,line)){
  141.                     setlinehighlight(bb,line*faktor);
  142.                      unsetlinehighlight(bb,line);
  143.             }
  144.         }
  145.         updateeditor(ob);
  146.  
  147.     }else{
  148.         if(isranged(ob)){
  149.  
  150.             /********** Shrink Range. ************/
  151.             startline=getrangestartline(ob);
  152.             endline=getrangeendline(ob);
  153.  
  154.             if((endline-startline+1)%faktor!=0){
  155.                 sendrexx("WI_SHOWSTRING Length of range is not divisable by faktor.");
  156.                 goto close;
  157.             }
  158.  
  159.             insertlines=-((endline-startline+1)*(faktor-1)/(faktor));
  160.  
  161.             numlines=numlines+insertlines;
  162.             if(numlines<1) goto close;
  163.  
  164.             fromline=startline;
  165.             for(line=startline+1;line<=endline+insertlines;line++){
  166.                 fromline+=faktor;
  167.                 for(track=0;track<numtracks;track++){
  168.                     setnote(bb,track,line,getnote(bb,track,fromline));
  169.                     setinum(bb,track,line,getinum(bb,track,fromline));
  170.                     for(page=1;page<=numpages;page++){
  171.                         setcmdnum(bb,track,line,page,getcmdnum(bb,track,fromline,page));
  172.                         setcmdlvl(bb,track,line,page,getcmdlvl(bb,track,fromline,page));
  173.                     }
  174.                 }
  175.                 highline=getlinehighlight(bb,fromline);
  176.                 if (highline!=getlinehighlight(bb,line))
  177.                     if (highline==1){
  178.                         setlinehighlight(bb,line);
  179.                     }else{
  180.                         unsetlinehighlight(bb,line);
  181.                     }
  182.             }
  183.  
  184.             /*************** Move lines. ************/
  185.             for(line=endline+insertlines+1;line<numlines;line++){
  186.                 fromline=line-insertlines;
  187.                 for(track=0;track<numtracks;track++){
  188.                     setnote(bb,track,line,getnote(bb,track,fromline));
  189.                     setinum(bb,track,line,getinum(bb,track,fromline));
  190.                     for(page=1;page<=numpages;page++){
  191.                         setcmdnum(bb,track,line,page,getcmdnum(bb,track,fromline,page));
  192.                         setcmdlvl(bb,track,line,page,getcmdlvl(bb,track,fromline,page));
  193.                     }
  194.                 }
  195.                 highline=getlinehighlight(bb,fromline);
  196.                 if (highline!=getlinehighlight(bb,line))
  197.                     if (highline==1){
  198.                         setlinehighlight(bb,line);
  199.                     }else{
  200.                         unsetlinehighlight(bb,line);
  201.                     }
  202.             }
  203.             sendrexxword("ED_SETBLOCKLINES LINES ",numlines,"");
  204.  
  205.         }else{
  206.             if(numlines%faktor!=0){
  207.                 sendrexx("WI_SHOWSTRING Length of block is not divisable by faktor.");
  208.                 goto close;
  209.             }
  210.             /********** Shrink Block. ************/
  211.             for(line=0;line<numlines/faktor;line++)
  212.                 if(getlinehighlight(bb,line*faktor)){
  213.                     if(getlinehighlight(bb,line)==0) setlinehighlight(bb,line);
  214.                 else{
  215.                     if(getlinehighlight(bb,line)==1) unsetlinehighlight(bb,line);
  216.                 }
  217.             }
  218.             sendrexxword("RN_SHRINKBLOCK ",faktor,"");
  219.         }
  220.     }
  221.  
  222.  
  223. close:
  224.     closefile(dosbase,filehandle);
  225.     closedoslibrary(dosbase);
  226.  
  227. exit:
  228. }
  229.